package com.ruoyi.business.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.business.domain.DangerGoodsPur;
import com.ruoyi.business.domain.DangerGoodsUse;
import com.ruoyi.business.mapper.DangerGoodsPurMapper;
import com.ruoyi.business.mapper.DangerGoodsUseMapper;
import com.ruoyi.business.service.IDangerGoodsUseService;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 危险品使用记录Service业务层处理
 * 
 * @author qiancheng
 * @date 2025-06-13
 */
@Service
public class DangerGoodsUseServiceImpl extends ServiceImpl<DangerGoodsUseMapper, DangerGoodsUse> implements IDangerGoodsUseService
{
    @Autowired
    private DangerGoodsUseMapper dangerGoodsUseMapper;

    @Autowired
    private DangerGoodsPurMapper dangerGoodsPurMapper;

    /**
     * 查询危险品使用记录
     * 
     * @param id 危险品使用记录主键
     * @return 危险品使用记录
     */
    @Override
    public DangerGoodsUse selectDangerGoodsUseById(Long id)
    {
        return dangerGoodsUseMapper.selectDangerGoodsUseById(id);
    }

    /**
     * 安全管理->>危险品管理->>查询危险品使用记录列表
     * 
     * @param dangerGoodsUse 危险品使用记录
     * @return 危险品使用记录
     */
    @Override
    public List<DangerGoodsUse> selectDangerGoodsUseList(DangerGoodsUse dangerGoodsUse)
    {
        return dangerGoodsUseMapper.selectDangerGoodsUseList(dangerGoodsUse);
    }

    /**
     * 安全管理->>危险品管理->>新增危险品使用记录
     * 
     * @param dangerGoodsUse 危险品使用记录
     * @return 结果
     */
    @Override
    public int insertDangerGoodsUse(DangerGoodsUse dangerGoodsUse)
    {
        // 使用数量校验
        if (dangerGoodsUse.getUseQuantity() == null || dangerGoodsUse.getUseQuantity() <= 0) {
            throw new RuntimeException("使用数量必须大于0");
        }

        // 如果没有purId但有goodsName，则根据goodsName查找对应的采购记录
        if ((dangerGoodsUse.getPurId() == null) && 
            (dangerGoodsUse.getGoodsName() != null && !dangerGoodsUse.getGoodsName().trim().isEmpty())) {
            DangerGoodsPur dangerGoodsPur = dangerGoodsPurMapper.selectDangerGoodsPurByGoodsName(dangerGoodsUse.getGoodsName().trim());
            if (dangerGoodsPur != null) {
                dangerGoodsUse.setPurId(dangerGoodsPur.getId());
            } else {
                throw new RuntimeException("未找到名称为「" + dangerGoodsUse.getGoodsName() + "」的危险品采购记录，无法创建使用记录");
            }

        }
        // 查询已使用数量
        Integer usedQuantity = dangerGoodsPurMapper.sumUsedQuantityByPurId(dangerGoodsUse.getPurId());

        if(usedQuantity==null){
            throw new RuntimeException("未找当前危险品采购记录，无法创建使用记录");
        }
        // 计算剩余数量
        if (dangerGoodsUse.getUseQuantity() > usedQuantity) {
            throw new RuntimeException("使用数量不能超过采购剩余数量，剩余数量：" + usedQuantity);
        }
        // 设置创建时间
        dangerGoodsUse.setCreateTime(DateUtils.getNowDate());
        // 设置默认删除标记：0-正常，1-删除
        if (dangerGoodsUse.getDelFlag() == null || dangerGoodsUse.getDelFlag().trim().isEmpty()) {
            dangerGoodsUse.setDelFlag("0");
        } else {
            // 限制delFlag的值，只允许"0"或"1"
            String delFlag = dangerGoodsUse.getDelFlag().trim();
            if (!"0".equals(delFlag) && !"1".equals(delFlag)) {
                dangerGoodsUse.setDelFlag("0");
            }
        }
        return dangerGoodsUseMapper.insert(dangerGoodsUse);
    }

    /**
     * 安全管理->>危险品管理->>修改危险品使用记录
     * 
     * @param dangerGoodsUse 危险品使用记录
     * @return 结果
     */
    @Override
    public int updateDangerGoodsUse(DangerGoodsUse dangerGoodsUse)
    {
        // 设置更新时间
        dangerGoodsUse.setUpdateTime(DateUtils.getNowDate());
        // 验证并修正delFlag的值
        if (dangerGoodsUse.getDelFlag() != null && !dangerGoodsUse.getDelFlag().trim().isEmpty()) {
            String delFlag = dangerGoodsUse.getDelFlag().trim();
            if (!"0".equals(delFlag) && !"1".equals(delFlag)) {
                dangerGoodsUse.setDelFlag("0");
            }
        }
        return dangerGoodsUseMapper.updateDangerGoodsUse(dangerGoodsUse);
    }

    /**
     * 安全管理->>危险品管理->>批量删除危险品使用记录
     * 
     * @param ids 需要删除的危险品使用记录主键
     * @return 结果
     */
    @Override
    public int deleteDangerGoodsUseByIds(Long[] ids)
    {
        return dangerGoodsUseMapper.deleteDangerGoodsUseByIds(ids);
    }

    /**
     * 删除危险品使用记录信息
     * 
     * @param id 危险品使用记录主键
     * @return 结果
     */
    @Override
    public int deleteDangerGoodsUseById(Long id)
    {
        return dangerGoodsUseMapper.deleteDangerGoodsUseById(id);
    }
}
